home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / crunch.arc / crunch.s next >
Text File  |  1989-07-24  |  12KB  |  776 lines

  1. * Program file Cruncher
  2. * Copyright 1989 By M.S.Powell (usqb015@uk.ac.liv)
  3. * Permission granted to examine and modify this source for; personal use,
  4. * no profit and as long as this header is left intact.
  5. * Written on Devpac v1.22 by Hisoft
  6.  
  7. * Examine command line
  8.  
  9.     move.l    4(sp),a5
  10.  
  11.     lea    129(a5),a5
  12.     cmp.b    #'-',(a5)
  13.     bne.s    nxtfield
  14.     addq.l    #1,a5
  15. chkqual    move.b    (a5)+,d0
  16.     cmp.b    #$d,d0
  17.     beq    invalid
  18.     cmp.b    #' ',d0
  19.     beq.s    nxtfield
  20.     cmp.b    #'D',d0
  21.     bne.s    notd
  22.     move    #1,delete
  23. notd    cmp.b    #'H',d0
  24.     bne.s    noth
  25.     move    #1,hold
  26. noth    cmp.b    #'U',d0
  27.     bne.s    notu
  28.     move    #1,uncrunch
  29. notu    cmp.b    #'I',d0
  30.     bne.s    chkqual
  31.     move    #1,ignore
  32.     bra.s    chkqual
  33.  
  34. nxtfield
  35.     cmp.b    #' ',(a5)
  36.     bne.s    getname1
  37.     addq.l    #1,a5
  38.     bra.s    nxtfield
  39. getname1
  40.     cmp.b    #$d,(a5)
  41.     beq    invalid
  42.     move.l    a5,sourcenamepnt
  43. getname1loop
  44.     move.b    (a5)+,d0
  45.     cmp.b    #$d,d0
  46.     beq.s    fndend1
  47.     cmp.b    #' ',d0
  48.     bne.s    getname1loop
  49. fndend1    subq.l    #1,a5
  50.     move.l    a5,sourcenameend
  51.     bra.s    intro
  52.  
  53. invalid    clr    cmndlnokay
  54.  
  55. * Intro procedure
  56.  
  57. intro    lea    mainmess(pc),a0
  58.     bsr    print
  59.  
  60.     tst    cmndlnokay
  61.     bne.s    clokay
  62.  
  63.     lea    instructions(pc),a0
  64.     bsr    print
  65.     bra    finished
  66.  
  67. clokay    pea    dta(pc)        set dta buffer
  68.     move    #$1a,-(sp)
  69.     trap    #1
  70.     addq.l    #6,sp
  71.  
  72.     clr    -(sp)            Search for source file
  73.     move.l    sourcenamepnt(pc),-(sp)
  74.     move    #$4e,-(sp)
  75.     trap    #1
  76.     addq.l    #8,sp
  77.     move    d0,error
  78.     beq    nextfile
  79.  
  80.     lea    nomatch(pc),a0
  81.     bsr    print
  82.     bra    finished
  83.  
  84. * Main loop
  85.  
  86. nextfile
  87.     lea    dta+30(pc),a0
  88.     move.l    sourcenameend(pc),a1
  89.     move.l    sourcenamepnt(pc),a2
  90. look_for_name_start
  91.     move.b    -(a1),d0
  92.     cmp.b    #'\',d0
  93.     beq.s    addname
  94.     cmp.b    #':',d0
  95.     beq.s    addname
  96.     cmp.l    a2,a1
  97.     bge.s    look_for_name_start
  98.  
  99. addname    moveq    #0,d1
  100.     addq.l    #1,a1
  101. anamlp    move.b    (a0)+,d0
  102.     move.b    d0,(a1)+
  103.     beq.s    done_name
  104.     cmp.b    #'.',d0
  105.     bne.s    anamlp
  106.     moveq    #1,d1
  107.     move.l    a1,sourcenameext
  108.     bra.s    anamlp
  109. done_name
  110.     tst    d1
  111.     bne.s    do_it
  112.     move.l    a1,sourcenameext
  113. do_it    bra    do_your_stuff
  114. return
  115.     tst    error
  116.     beq.s    noerror
  117.  
  118.     tst    ignore
  119.     beq.s    finished
  120.  
  121. noerror    move    #$4f,-(sp)
  122.     trap    #1
  123.     addq.l    #2,sp
  124.     tst    d0
  125.     beq.s    nextfile
  126.  
  127. finished
  128.     tst    hold
  129.     beq.s    nohold
  130.  
  131.     lea    pressany(pc),a0    
  132.     bsr    print
  133.     bsr.s    anykey
  134.  
  135. nohold    move    error(pc),-(sp)        Return error code to calling
  136.     move    #$4c,-(sp)        program
  137.     trap    #1    
  138.  
  139. anykey    pea    $20002
  140.     trap    #13
  141.     addq.l    #4,sp
  142.     rts
  143.  
  144. prchar    move    d0,-(sp)
  145.     pea    $30002
  146.     trap    #13
  147.     addq.l    #6,sp
  148.     rts
  149.  
  150.     
  151. * Main loop body
  152.  
  153. do_your_stuff
  154.     move.l    sp,stack
  155.  
  156.     lea    reading(pc),a0
  157.     bsr    print
  158.     bsr    printfilename
  159.  
  160.     move.l    sp,a6
  161.     sub.l    #4096,a6    a6=top of free memory
  162.     move.l    dta+26(pc),d6    d6=file length
  163.     cmp.l    #28,d6
  164.     blt.s    not_a_program
  165.  
  166.     lea    buffer(pc),a0
  167.     add.l    d6,a0
  168.     cmp.l    a6,a0
  169.     bgt    outofmemory
  170.  
  171. * Read in file
  172.  
  173.     lea    buffer(pc),a3
  174.     clr    -(sp)
  175.     move.l    sourcenamepnt(pc),-(sp)
  176.     move    #$3d,-(sp)
  177.     trap    #1
  178.     addq.l    #8,sp
  179.     tst.l    d0
  180.     bmi    fileerror
  181.  
  182.     move    d0,d7
  183.     pea    (a3)        Read first 2 bytes, to check if it is
  184.     pea    2.w        a valid GEMDOS program
  185.     move    d0,-(sp)
  186.     move    #$3f,-(sp)
  187.     trap    #1
  188.     lea    12(sp),sp
  189.     tst.l    d0
  190.     bmi    fileerror
  191.     cmp    #$601a,(a3)
  192.     beq.s    a_prog
  193.  
  194. not_a_program
  195.     lea    notprog(pc),a0
  196.     bsr    print
  197.     bra    exit
  198.  
  199. a_prog    pea    2(a3)
  200.     move.l    d6,-(sp)
  201.     move    d7,-(sp)
  202.     move    #$3f,-(sp)
  203.     trap    #1
  204.     lea    12(sp),sp
  205.     tst.l    d0
  206.     bmi    fileerror
  207.  
  208.     move    d7,-(sp)
  209.     move    #$3e,-(sp)
  210.     trap    #1
  211.     addq.l    #4,sp
  212.  
  213. * Check if file is already crunched
  214.  
  215.     lea    buffer+$1c(pc),a0
  216.     lea    header+$1c(pc),a1
  217.     move    #lengthoftable-header-$1c-1,d0
  218. chklp    cmpm.b    (a0)+,(a1)+
  219.     dbne    d0,chklp
  220.     bne    crunchfile
  221.  
  222. * If file is already crunched, then uncrunch it
  223.  
  224.     tst    uncrunch
  225.     bne.s    uncrunchit
  226.  
  227.     lea    crunched(pc),a0
  228.     bsr    print
  229.     bra    exit
  230.  
  231. uncrunchit
  232.     lea    uncrunching(pc),a0
  233.     bsr    print
  234.  
  235.     lea    buffer+(lengthoftable-header)(pc),a0
  236.     lea    buffer-lengthoftable(a0),a3
  237.     move.l    (a0)+,a4
  238.     add.l    a3,a4
  239.     move.l    (a0)+,a5
  240.     add.l    a4,a5
  241.  
  242.     move.l    (a0)+,d0
  243.     move.l    (a3),d1
  244.     and.l    #$ffffff,d1
  245.     lea    0(a4,d1.l),a0
  246.     move.l    a0,a2
  247.     lea    0(a5,d0.l),a1
  248.     cmp.l    a6,a1
  249.     bgt    outofmemory
  250.     move.l    a1,a6
  251. moveup1    move.b    -(a5),-(a1)
  252.     cmp.l    a5,a0
  253.     bne.s    moveup1
  254.     move.l    a6,a5
  255.     move.l    a1,a6
  256.  
  257. uncrunchloop1
  258.     move.l    (a3)+,d1
  259.     move.l    d1,d2
  260.     rol.l    #8,d2
  261.     and.l    #$ffffff,d1
  262.     moveq    #0,d3
  263.     move    (a3)+,d3
  264.     bne.s    not103
  265.     move.l    #65536,d3
  266. not103    add.l    d0,d1
  267.     sub.l    d3,d0
  268.     lea    0(a4,d1.l),a0
  269.     cmp.l    a6,a0
  270.     beq.s    nomove12
  271. movebitdown1
  272.     move.b    (a6)+,(a2)+
  273.     cmp.l    a6,a0
  274.     bne.s    movebitdown1
  275. nomove12
  276.     subq    #1,d3
  277. makeblock1
  278.     move.b    d2,(a2)+
  279.     dbra    d3,makeblock1
  280.     tst.l    d0
  281.     bne.s    uncrunchloop1
  282.  
  283.     move.l    a5,a3
  284.     sub.l    a4,a3
  285.  
  286.     tst    delete
  287.     beq    writefile
  288.     move.l    sourcenameext(pc),a0
  289.     move.b    #'.',-1(a0)
  290.     move.b    #'U',(a0)+
  291.     move.b    #'C',(a0)+
  292.     move.b    #'R',(a0)+
  293.     bra    writefile
  294.  
  295. * Crunch a file
  296.     
  297. crunchfile
  298.     tst    uncrunch
  299.     beq.s    okaycf
  300.  
  301.     lea    notcrunched(pc),a0
  302.     bsr    print
  303.     bra    exit
  304.  
  305. okaycf    lea    crunching(pc),a0
  306.     bsr    print
  307.  
  308.     move.l    a6,a5
  309.     sub.l    d6,a5
  310.     move.l    a6,a4
  311.     lea    0(a3,d6.l),a3
  312. moveprogup
  313.     move.b    -(a3),-(a4)
  314.     cmp.l    a4,a5
  315.     bne.s    moveprogup
  316.     
  317.     lea    buffer(pc),a4
  318.     lea    -6(a6),a2
  319.     move.l    2(a4),d7
  320.     add.l    6(a4),d7
  321.     add.l    $a(a4),d7    d7=total original length
  322.  
  323.     move.l    a5,a0
  324. p1lp    moveq    #0,d0
  325.     move.b    (a0),d0
  326.     cmp.b    1(a0),d0
  327.     bne.s    notsam
  328.     cmp.b    2(a0),d0
  329.     bne.s    notsam
  330.     cmp.b    3(a0),d0
  331.     bne.s    notsam
  332.     cmp.b    4(a0),d0
  333.     bne.s    notsam
  334.     cmp.b    5(a0),d0
  335.     bne.s    notsam
  336.     cmp.b    6(a0),d0
  337.     bne.s    notsam
  338.  
  339.     lea    7(a0),a1
  340. fndend    cmp.l    a6,a1
  341.     bgt.s    endprog
  342.     cmp.b    (a1)+,d0
  343.     beq.s    fndend
  344. endprog    move.l    a0,d1
  345.     sub.l    a5,d1
  346.     ror.l    #8,d0
  347.     or.l    d0,d1
  348.     subq.l    #1,a1
  349.     move.l    a1,d2
  350.     sub.l    a0,d2
  351. nextbit    cmp.l    #65536,d2
  352.     ble.s    lastbit
  353.     move.l    d1,(a4)+
  354.     add.l    #65536,d1
  355.     clr    (a4)+
  356.     sub.l    #65536,d2
  357.     bra.s    nextbit
  358. lastbit    move.l    d1,(a4)+
  359.     move    d2,(a4)+
  360.     cmp.l    a5,a4
  361.     bge    outofmemory
  362.     lea    -1(a1),a0
  363.  
  364. notsam    addq.l    #1,a0
  365.     cmp.l    a2,a0
  366.     blt.s    p1lp
  367.  
  368.     lea    buffer+4(pc),a3
  369.     cmp.l    a3,a4        Is table empty?
  370.     blt    hopeless
  371.     move.l    a4,-(sp)
  372.     moveq    #0,d1
  373.     move    -(a4),d1
  374.     bne.s    not0
  375.     move.l    #65536,d1
  376. not0    move.l    -4(a4),d2
  377.     and.l    #$ffffff,d2
  378.     add.l    d1,d2
  379.     lea    0(a5,d2.l),a2
  380.     cmp.l    a4,a3
  381.     beq.s    lastblock
  382. crunchloop
  383.     move.l    -(a4),d2
  384.     and.l    #$ffffff,d2
  385.     lea    0(a5,d2.l),a1
  386.     moveq    #0,d1
  387.     move    -(a4),d1
  388.     bne.s    not01
  389.     move.l    #65536,d1
  390. not01    move.l    -4(a4),d2
  391.     and.l    #$ffffff,d2
  392.     add.l    d1,d2
  393.     lea    0(a5,d2.l),a0
  394.     cmp.l    a1,a0
  395.     beq.s    nomove
  396. removeblock
  397.     move.b    -(a1),-(a2)
  398.     cmp.l    a1,a0
  399.     bne.s    removeblock
  400. nomove    cmp.l    a4,a3
  401.     bne.s    crunchloop
  402.  
  403. lastblock
  404.     move.l    -(a4),d1
  405.     and.l    #$ffffff,d1
  406.     lea    0(a5,d1.l),a1
  407.     cmp.l    a5,a1
  408.     beq.s    nomove1
  409. removelastblock
  410.     move.b    -(a1),-(a2)
  411.     cmp.l    a5,a1
  412.     bne.s    removelastblock
  413. nomove1    move.l    a2,a5
  414.  
  415.     move.l    (sp)+,a4
  416.  
  417. * Add uncrunch program
  418.  
  419. done    move.l    a4,a3
  420.     move.l    a5,a2    attach crunched prog to end of table
  421. moveprog
  422.     move.b    (a2)+,(a3)+
  423.     cmp.l    a2,a6
  424.     bne.s    moveprog
  425.  
  426.     move.l    a3,d0
  427.     sub.l    a4,d0
  428.     move.l    d0,lengthofprog
  429.  
  430.     move.l    a4,d0
  431.     lea    buffer(pc),a2
  432.     sub.l    a2,d0
  433.     move.l    d0,lengthoftable
  434.  
  435.     moveq    #0,d1
  436. getlengthloop
  437.     addq.l    #4,a2
  438.     moveq    #0,d0
  439.     move    (a2)+,d0
  440.     bne.s    not02
  441.     move.l    #65536,d0
  442. not02    add.l    d0,d1
  443.     cmp.l    a2,a4
  444.     bne.s    getlengthloop
  445.     move.l    d1,totallength
  446.  
  447.     lea    header(pc),a4
  448.     sub.l    a4,a3
  449.     move.l    a3,d0
  450.     add.l    #1023,d0
  451.     and.l    #$fffc00,d0
  452.     add.l    #1023,d6
  453.     and.l    #$fffc00,d6
  454.     cmp.l    d0,d6
  455.     ble    hopeless
  456.     lea    -$1c(a3),a0
  457.     move.l    a0,2(a4)
  458.     sub.l    a0,d7
  459.     move.l    d7,$a(a4)
  460.  
  461.     tst    delete
  462.     beq.s    writefile
  463.     move.l    sourcenameext(pc),a0
  464.     move.b    #'.',-1(a0)
  465.     move.b    #'C',(a0)+
  466.     move.b    #'R',(a0)+
  467.     move.b    #'N',(a0)+
  468.  
  469. writefile
  470.     lea    writing(pc),a0
  471.     bsr    print
  472.     bsr    printfilename
  473.  
  474.     clr    -(sp)
  475.     move.l    sourcenamepnt(pc),-(sp)
  476.     move    #$3c,-(sp)
  477.     trap    #1
  478.     addq.l    #8,sp
  479.     tst.l    d0
  480.     bmi    fileerror
  481.  
  482.     move    d0,-(sp)
  483.     pea    (a4)
  484.     pea    (a3)
  485.     move    d0,-(sp)
  486.     move    #$40,-(sp)
  487.     trap    #1
  488.     lea    12(sp),sp
  489.     tst.l    d0
  490.     bmi    fileerror
  491.  
  492.     move    #$3e,-(sp)
  493.     trap    #1
  494.     addq.l    #4,sp
  495.     tst.l    d0
  496.     bmi    fileerror
  497.  
  498. exit    move.l    stack(pc),sp
  499.     bra    return
  500.  
  501.  
  502.  
  503. * Error routines
  504.  
  505. outofmemory
  506.     lea    outmem(pc),a0
  507.     bsr.s    print
  508.     move    #-39,error
  509.     bra.s    exit
  510.  
  511. fileerror
  512.     move    d0,error
  513.     lea    generror(pc),a0
  514.     bsr.s    print
  515.     bra.s    exit
  516.  
  517. hopeless
  518.     lea    nohope(pc),a0
  519.     bsr.s    print
  520.     bra.s    exit
  521.  
  522. print    pea    (a0)
  523.     move    #9,-(sp)
  524.     trap    #1
  525.     addq.l    #6,sp
  526.     rts
  527.  
  528. printfilename
  529.     move.l    sourcenamepnt(pc),a5    Print file name
  530. prnamlp    move.b    (a5)+,d0
  531.     beq.s    donenameprint
  532.     bsr    prchar
  533.     bra.s    prnamlp
  534. donenameprint
  535.     moveq    #13,d0
  536.     bsr    prchar
  537.     moveq    #10,d0
  538.     bra    prchar
  539.  
  540. find_target_file_ext
  541.     lea    dta+30(pc),a0
  542. lookext    move.b    (a0)+,d0
  543.     beq.s    fndext
  544.     cmp.b    #'.',d0
  545.     bne.s    lookext
  546.  
  547. fndext    move.b    #'.',-1(a0)
  548.     rts
  549.  
  550.  
  551. * Various data
  552.  
  553. mainmess
  554.     dc.b    27,'vProgram file cruncher V3.2',13,10,13,10
  555.     dc.b    'Copyright 4/9/1988 By M.S.Powell',13,10,0
  556. instructions
  557.     dc.b    13,10,'Usage:',13,10,13,10
  558.     dc.